#!/usr/bin/python
# -*- coding: UTF8 -*-
# archivo : fabrica.py
#
###############################################################################
#
#
# Eco-Py - Juego educativo, ayudando a preservar el medioambiente
# Copyright (c) 2010 Javier Castrillo // riverplatense at gmail dot com
# Este programa es software libre; usted puede redistruirlo y/o modificarlo bajo
# los términos de la Licencia Pública General GNU, tal y como está publicada
# por la Free Software Foundation; ya sea la versión 2 de la Licencia, o (a su
# elección) cualquier versión posterior.
#
# Este programa se distribuye con la intención de ser útil, pero SIN NINGUNA
# GARANTÍA; incluso sin la garantía implícita de USABILIDAD O UTILIDAD PARA UN
# FIN PARTICULAR. Vea la Licencia Pública General GNU para más detalles.
#
# Usted debería haber recibido una copia de la Licencia Pública General GNU
# junto a este programa; si no es así, escriba a la Free Software Foundation,
# Inc. 675 Mass Ave, Cambridge, MA 02139, EEUU.
#
#
###############################################################################


# Módulos
import sys, pygame
from pygame.locals import *
from pygame.sprite import Group
import random
import time
import menu

#Inicializamos pygame y sonido
#9.11pygame.mixer.pre_init(44100, -16, False)
pygame.init()
#---------------------------------------------------------------
# Constantes
ANCHO = 800
ALTO = 550    

#9.11MUSICA = pygame.mixer.Sound("sonidos/je.wav")
FBM_SPEED = 0.2
f = open('cargado', 'w')
f.write('0')
f.close()
#---------------------------------------------------------------
# Clases


class Personaje(pygame.sprite.Sprite):
    """Inicializo la clase, le doy argumentos, fijo posición y velocidad"""
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/pp_14.png', True)
        self.rect = self.image.get_rect()
        self.rect.centerx = 80
        self.rect.centery = 500
        self.speed = 0.2
   
    def mover(self, tiempo, keys):
        if self.rect.top >= 0:
            if keys[K_UP]:
                n = random.randint(2, 3)
                self.image = cargar_imagen('images/pp_%d.png'%n, True)
                self.rect.centery -= self.speed * tiempo
                
        if self.rect.bottom <= ALTO:
            if keys[K_DOWN]:
                a = random.randint(0, 1)
                self.image = cargar_imagen('images/pp_%d.png'%a, True)
                self.rect.centery += self.speed * tiempo
                
        #indico al personaje que cuando llegue a 0 px de 'x' reaparezca en 800px
        if self.rect.left >= 0:
            if keys[K_LEFT]:
                self.rect.centerx -= self.speed * tiempo
                l = random.randint(4, 5)
                self.image = cargar_imagen('images/pp_%d.png'%l, True)
           
                if self.rect.left < 1:
                    self.rect.left = ANCHO
                    self.rect.centerx -= self.speed * tiempo
                
        #indico al personaje que cuando llegue a 800 px de 'x' reaparezca en 0px
       

        if self.rect.right < ANCHO:
            if keys[K_RIGHT]:
                
            
                self.rect.centerx += self.speed * tiempo
                e = random.randint(6, 7)
                self.image = cargar_imagen('images/pp_%d.png'%e, True)
                if self.rect.right > ANCHO:
                    self.rect.right = 0
                    self.rect.centerx += self.speed * tiempo
              
class Martillo(pygame.sprite.Sprite):
    """Inicializo la clase y le doy argumentos y fijo posoción"""

    def __init__(self):
        f = open('reparar', 'w')
        f.write('0')
        f.close()
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/martillo.png', True)#Con True corrijo transparencias
        self.rect = self.image.get_rect()
        self.rect.centerx = 730
        self.rect.centery = 425 
    
    def colision(self, personaje, puntos):
        """Creo la colision. Lo hago desaparecer de pantalla y le doy puntaje"""
        if pygame.sprite.collide_rect(self, personaje):
            self.rect.centerx = 1000
            f = open('reparar', 'w')
            f.write('1')
            f.close()
            puntos[0] += 500
        return puntos
             

class Paleta(pygame.sprite.Sprite):
    """Inicializo la clase y le doy argumentos y fijo posoción"""
    def __init__(self):
        f = open('cargado', 'w')
        f.write('0')
        f.close()
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/off.png', True)#Con True corrijo transparencias
        self.rect = self.image.get_rect()
        self.rect.centerx = 650
        self.rect.centery = 130
    
    def colision(self, personaje, puntos):
        """Creo la colision. Lo hago desaparecer de pantalla y le doy puntaje"""
        if pygame.sprite.collide_rect(self, personaje):
            f = open('cargado', 'w')
            f.write('1')
            f.close()
            self.rect.centerx = 1000
            puntos[0] += 500
                        
            
class Lata(pygame.sprite.Sprite):
    """Inicializo la clase, doy argumentos, y creo variables para posición"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/lata2.png', True)
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.centery = y
    
    def colision(self, personaje, puntos):
        """Creo la colisión. Lo hago desaparecer de pantalla y le doy puntaje"""
        if pygame.sprite.collide_rect(self, personaje):
            puntos[0] += 200
            self.rect.centerx = 1000



class Pared_H(pygame.sprite.Sprite):
    """Inicializo la clase, doy argumentos, y creo variables para posición"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/camino1.png', True)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
    
    def colision(self, personaje, puntos, tiempo, keys):
        """Creo la colisión. Le resto puntaje"""
        if keys[K_UP] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.bottom += 0.22 * tiempo
            puntos[0] -= 10
        if keys[K_DOWN] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.top -= 0.22 * tiempo 
            puntos[0] -= 10
        if keys[K_LEFT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.right += 0.22 * tiempo
            puntos[0] -= 10
        if keys[K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.left -= 0.22 * tiempo
            puntos[0] -= 10

        
class Pared_V(pygame.sprite.Sprite):
    """Inicializo la clase, doy argumentos, y creo variables para posición"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/camino2.png', True)
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y

    def colision(self, personaje, puntos, tiempo, keys):
        """Creo la colision. Le resto puntaje"""
        if keys [K_LEFT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.right += 0.22 * tiempo 
            puntos[0] -= 10
        if keys [K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.left -= 0.22 * tiempo
            puntos[0] -= 10
        if keys[K_UP] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.bottom += 0.22 * tiempo
            puntos[0] -= 10
        if keys[K_DOWN] and pygame.sprite.collide_rect(self, personaje):
            personaje.rect.top -= 0.22 * tiempo 
            puntos[0] -= 10

        
    
class Mosquito(pygame.sprite.Sprite):
    """Inicializo la clase y le doy argumentos"""
    def __init__(self, x, y):
        x = x
        y = y
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/mosquito1.png', True)#Con True corrijo transparencias
        self.rect = self.image.get_rect()
        self.rect.centery = x
        self.rect.centery = y
        self.speed = [0.4, -0.4]

    def ia(self, tiempo, personaje):
        """Creo la inteligencia artificial que mover al mosquito a lo ancho de la pantalla"""
        self.rect.centerx += self.speed[0] * tiempo 
        if self.rect.left <= 0 or self.rect.right >= ANCHO:
            self.speed[0] = -self.speed[0]
        """Creo la colisión entre mosquito y personaje. Si se tocan mosquito se detiene y finaliza el juego perdiendo el personaje"""
        f = open('cargado', 'r')
        estado = f.readline()
        estado.strip()
        f.close()

        if estado == '0':
            if pygame.sprite.collide_rect(self, personaje):
                self.speed = [0, 0]
                #9.11 MUSICA.stop()
                import reiniciar
                reiniciar.main() #dirige al menu de opciones
        else:
            self.rect.centerx = 1000
        
        return
        
class Fabrica(pygame.sprite.Sprite):
    """Inicializo la clase, doy argumentos, y creo variables para posición"""
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = cargar_imagen('images/fabrica2.png', True)#Con True corrijo transparencias
        self.rect = self.image.get_rect()
        self.rect.centerx = 750
        self.rect.centery = 40
                                            
    def colision(self, personaje, puntos, tiempo, keys):
        """Creo la colisión, le doy puntaje y voy a siguiente pantalla de seguir jugando"""
        f = open('reparar', 'r')
        estadom = f.readline()
        estadom.strip()
        f.close()
        if estadom == '1':
            if keys [K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
                personaje.rect.right -= personaje.speed * tiempo
                puntos[0] += 1000
                self.rect.centerx = 1000
                self.image = cargar_imagen('images/fabrica3.png', True)#Con True corrijo
                self.rect = self.image.get_rect()                        #transparencias
                self.rect.centerx = 750
                self.rect.centery = 40

                time.sleep(2)
                menu.main()

    #       MUSICA.stop()
        else:
            if keys [K_RIGHT] and pygame.sprite.collide_rect(self, personaje):
                personaje.rect.right -= personaje.speed * tiempo
        return  
#---------------------------------------------------------------
# Funciones

def cargar_imagen(nombre_archivo, transparent=True):
    """ La utilizo para cargar imagenes y me fijo si tiene partes transparentes y las tomo como falso en principio, luego si es necesario lo corrijo con un True"""
    try:
        image = pygame.image.load(nombre_archivo)
    except pygame.error, message:
        raise SystemExit, message
    image = image.convert()
    if transparent:
        color = image.get_at((0,0))
        image.set_colorkey(color, RLEACCEL)
    return image
    
def texto(texto, posx, posy, color=(255, 0, 0)):
    """ La utilizo para cargar la fuente del texto, tamaño. color y variable para posición"""
    fuente = pygame.font.Font('fonts/karnivor.ttf', 25)
    salida = pygame.font.Font.render(fuente, texto, 1, color)
    salida_rect = salida.get_rect()
    salida_rect.centerx = posx
    salida_rect.centery = posy
    return salida, salida_rect
   

#---------------------------------------------------------------

def main():
    

#9.11    MUSICA.play(-1)
    screen = pygame.display.set_mode ((ANCHO, ALTO))
    pygame.display.set_caption('fabricas.pygame')
    fondo = cargar_imagen('images/pradera11.jpg')
    mosquito1 = Mosquito(240, 240)
    mosquito2 = Mosquito(400, 400)
    martillo = Martillo()
    paleta = Paleta()
    fabrica = Fabrica()
    #posiciono latas
    latita1 = Lata(260, 230)
    latita2 = Lata(400, 405)
    latita3 = Lata(480, 495)
    latita4 = Lata(580, 230)
    ph1 = Pared_H(100, 80)
    ph2 = Pared_H(350, 80)
    ph3 = Pared_H(550, 80)
    ph4 = Pared_H(0, 180)
    ph5 = Pared_H(250, 180)
    ph6 = Pared_H(450, 180)
    ph7 = Pared_H(130, 280)
    ph8 = Pared_H(100, 280)
    ph9 = Pared_H(350, 280)
    ph10 = Pared_H(600, 280)
    ph11 = Pared_H(100, 360)
    ph12 = Pared_H(350, 360)
    ph13 = Pared_H(550, 360)
    ph14 = Pared_H(0, 450)
    ph15 = Pared_H(350, 450)
    ph16 = Pared_H(450, 450)
    ph = Group()
    ph.add([ph1, ph2, ph3, ph4, ph5, ph6, ph7, ph8, ph9, ph10, ph11, ph12, ph13, ph14, ph15, ph16])
    pv1 = Pared_V(5, 0)
    pv2 = Pared_V(5, 90)
    pv3 = Pared_V(785, 85)
    pv4 = Pared_V(5, 280)
    pv5 = Pared_V(100, 280)
    pv6 = Pared_V(785, 450)
    pv7 = Pared_V(785, 360)
    pv8 = Pared_V(5, 360)
    pv9 = Pared_V(5, 450)
    pv = Group()
    pv.add(pv1, pv2, pv3, pv4, pv5, pv6, pv7, pv8, pv9)
    #personaje = Personaje() #3.11
    personaje = Personaje(0, 450) # posiciono al personaje
    clock = pygame.time.Clock()  
    puntos = [0]  #creo la lista en donde se guarda el puntaje

    while True:

        tiempo = clock.tick(60)
        keys = pygame.key.get_pressed()#para saber las teclas pulsadas
        for eventos in pygame.event.get():
            if eventos.type == QUIT:
                sys.exit(0)
        
        p, p_rect = texto(str(puntos[0]), ANCHO/4, 40) #Posiciono el puntaje
        puntos = martillo.colision(personaje, puntos)
        screen.blit(fondo,(0,0))#Posiciono el fondo
        screen.blit(p, p_rect)#Muestro el puntaje
        #Posiciono las latas        
        screen.blit(latita1.image, latita1.rect)
        screen.blit(latita2.image, latita2.rect)
        screen.blit(latita3.image, latita3.rect)
        screen.blit(latita4.image, latita4.rect)
        #Posiciono el camino a seguir por el personaje
        
        Group.draw(ph, screen)
        Group.draw(pv, screen)
        screen.blit(mosquito1.image, mosquito1.rect)#Posiciono el mosquito  
        screen.blit(mosquito2.image, mosquito2.rect)#Posiciono el mosquito        
        screen.blit(paleta.image, paleta.rect)#Posiciono la paleta
        screen.blit(martillo.image, martillo.rect)#Posiciono el martillo
        screen.blit(fabrica.image, fabrica.rect)
        personaje.mover(tiempo, keys) #llamamos al metodo mover teclas
        screen.blit(personaje.image, personaje.rect) #mostramos al personaje
        mosquito1.ia(tiempo, personaje)#llamamos a la inteligencia artificial
        mosquito2.ia(tiempo, personaje)#llamamos a la inteligencia artificial
        #Muestro el puntaje
        paleta.colision(personaje, puntos)
        martillo.colision (personaje, puntos)
        
        latita1.colision(personaje, puntos)
        latita2.colision(personaje, puntos)
        latita3.colision(personaje, puntos)
        latita4.colision(personaje, puntos)
        
        ph1.colision(personaje, puntos, tiempo, keys)
        ph2.colision(personaje, puntos, tiempo, keys)
        ph3.colision(personaje, puntos, tiempo, keys)
        ph4.colision(personaje, puntos, tiempo, keys)
        ph5.colision(personaje, puntos, tiempo, keys)
        ph6.colision(personaje, puntos, tiempo, keys)
        ph7.colision(personaje, puntos, tiempo, keys)
        ph8.colision(personaje, puntos, tiempo, keys)
        ph9.colision(personaje, puntos, tiempo, keys)
        ph10.colision(personaje, puntos, tiempo, keys)
        ph11.colision(personaje, puntos, tiempo, keys)
        ph12.colision(personaje, puntos, tiempo, keys)
        ph13.colision(personaje, puntos, tiempo, keys)
        ph14.colision(personaje, puntos, tiempo, keys)
        ph15.colision(personaje, puntos, tiempo, keys)
        ph16.colision(personaje, puntos, tiempo, keys)
        pv1.colision(personaje, puntos, tiempo, keys)
        pv2.colision(personaje, puntos, tiempo, keys)
        pv3.colision(personaje, puntos, tiempo, keys)
        pv4.colision(personaje, puntos, tiempo, keys)
        pv5.colision(personaje, puntos, tiempo, keys)
        pv6.colision(personaje, puntos, tiempo, keys)
        pv7.colision(personaje, puntos, tiempo, keys)
        pv8.colision(personaje, puntos, tiempo, keys)
        pv9.colision(personaje, puntos, tiempo, keys)
    
        fabrica.colision(personaje, puntos, tiempo, keys)

        pygame.display.flip()
#9.11    MUSICA.stop()       

    return 0

if __name__ == '__main__':
    pygame.init()
   # pygame.mixer.init()
    main()


